#ifndef BRODOCAST_H
#define BRODOCAST_H


#include <list>
#include "Grupo.h"
#include "ConfiguracaoBrodocast.h"
#include "ComunicadorTCP.h"
#include "ComunicadorUDP.h"

using namespace std;


class Brodocast
{
private:
    Brodocast();
    static Brodocast * m_instacia;
    static Brodocast * getBrodocast();
    ComunicadorUDP *m_comunicadorUDP;

protected:
    Grupo * m_grupo; /**< Armazena os nodos conectados no grupo */
    ConfiguracaoBrodocast *m_config;  /**< Armazena configuracões do brodocast */

public:

    /**
     * @brief
     *  Cria um novo grupo
     * @param config - Configuracao do grupo
     * @return Brodocast - Brodocast conectado no novo grupo.
     */
    static Brodocast* criaBrodocast(ConfiguracaoBrodocast *config );

    ~Brodocast();

    /**
     * @brief
     *  Busca os grupos disponiveis na rede
     * @param lista - Lista de grupos disponiveis.
     */
    static void buscaGrupo(list<Grupo *> &lista);

    /**
     * @brief
     *  Entra em um grupo
     * @param grupo - Grupo
     * @return Brodocast - Brodocast conectado no grupo
     */
    static Brodocast* entrar( Grupo *grupo);

    /**
     * @brief
     *  Envia uma mensagem broadcast
     * @param msg - Mensagem
     */
    void enviar( const char *msg);

    /**
     * @brief
     *  Recebe uma mensagem brodcast
     * @return string
     */
    string recebe();

};

#endif // BRODOCAST_H
